#pragma once

#include <iostream>
#include <vector>
#include <string>

namespace task
{
    struct sTaskPoint
    {
        std::string point_id;
        float x;
        float y;
        float z;
        float theta;

        sTaskPoint()
        {
            x = 0.0f;
            y = 0.0f;
            z = 0.0f;
            theta = 0.0f;
        }
    };
    struct sTaskPath
    {
        std::string path_id;
        std::string path_type;
        std::string move_direction; // AMR move direction "forward" or "backward"
        uint32_t task_id;
        std::vector<sTaskPoint> v_control_points;
        std::vector<sTaskPoint> v_key_points;
        float max_speed;
        float amr_angle;
        std::string angle_type;
        sTaskPath()
        {
            path_id = "";
            path_type = "";
            move_direction = "";
            angle_type = "";
        }
    };

    struct sTaskReceive
    {
        std::string header;
        std::string command;
        uint32_t SN;
        uint32_t task_id;
        std::string target_id;
        std::string map_id;
        float speed_level;
        std::vector<std::string> point_list;

        sTaskReceive()
        {
            SN = 0;
            task_id = 0;
            map_id = "";
            point_list.clear();
        }
    };
 
    struct sTaskMsg
    {
        std::vector<sTaskPath> v_task_path;
        std::string target_point_id;
    };

    struct sFirmwareInfo
    {
        std::string firm_version;
        std::string firm_date;
        std::string node;
        sFirmwareInfo()
        {
            firm_version = "";
            firm_date    = "";
            node         = "";
        }
    };   
}